import { Tool } from "@langchain/core/tools";
import { WeatherTool } from "./tools";

/**
 * 工具管理器
 * 作用：统一管理所有工具，提供工具调用功能
 */
export class ToolManager {
  private tools: Map<string, Tool> = new Map();

  constructor() {
    this.initializeTools();
  }

  /**
   * 初始化所有工具
   */
  private initializeTools(): void {
    // 注册天气工具
    this.registerTool(new WeatherTool());
  }

  /**
   * 注册工具
   */
  private registerTool(tool: Tool): void {
    this.tools.set(tool.name, tool);
    console.log(`✅ 工具已注册: ${tool.name}`);
  }

  /**
   * 获取工具
   */
  getTool(name: string): Tool | undefined {
    return this.tools.get(name);
  }

  /**
   * 获取所有工具名称
   */
  getToolNames(): string[] {
    return Array.from(this.tools.keys());
  }

  /**
   * 获取所有工具
   */
  getAllTools(): Tool[] {
    return Array.from(this.tools.values());
  }

  /**
   * 获取所有工具的描述信息（用于构建提示词）
   */
  getToolsDescription(): string {
    const descriptions = Array.from(this.tools.values()).map(tool => {
      return `工具名称：${tool.name}
工具描述：${tool.description}
参数schema：${JSON.stringify(tool.schema, null, 2)}`;
    });

    return descriptions.join("\n\n");
  }

  /**
   * 调用工具
   */
  async callTool(name: string, args: any): Promise<string> {
    const tool = this.getTool(name);
    if (!tool) {
      throw new Error(`未找到工具: ${name}`);
    }

    try {
      console.log(`🔧 调用工具: ${name}, 参数:`, args);
      const result = await tool.call(args);
      console.log(`✅ 工具调用成功: ${name}, 结果:`, result);
      return result;
    } catch (error) {
      console.error(`❌ 工具调用失败: ${name}, 错误:`, error);
      throw new Error(`工具调用失败: ${error instanceof Error ? error.message : '未知错误'}`);
    }
  }
}